home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / execv.i < prev    next >
Text File  |  1997-10-26  |  4KB  |  120 lines

  1. IMPLEMENTATION MODULE ExecV;
  2.  
  3. (*$A+*)
  4. FROM SYSTEM IMPORT ADDRESS,ADR;
  5.  
  6. FROM MagicTypes IMPORT PtrPD;
  7.  
  8. IMPORT MagicSys, MagicDOS;
  9.  
  10. PROCEDURE Pexec(mode: MagicSys.sCARDINAL;
  11.                 VAR Path: ARRAY OF CHAR;
  12.                 VAR CmdLn: ARRAY OF CHAR;
  13.                 VAR Env: ARRAY OF CHAR): MagicSys.sINTEGER;
  14. TYPE
  15.   tpChar = POINTER TO CHAR;
  16.   lcPtr  = POINTER TO LONGCARD;
  17. VAR
  18.   env,
  19.   ptr,
  20.   tmpPtr,
  21.   von,bis: tpChar;
  22.   el,
  23.   pl,
  24.   cl,
  25.   D0: MagicSys.sCARDINAL;
  26.   path,cmdln: tpStr;
  27.   BasePage: PtrPD;
  28.   res   : MagicSys.sINTEGER;
  29. BEGIN
  30.   IF (LENGTH(Path)=0) OR (LENGTH(CmdLn)=0) THEN (* CreateBasePage, Exec[Free][Return] *)
  31.     (* ARGV nicht m”glich *)
  32.     RETURN MagicDOS.Pexec(mode,Path,CmdLn,Env)
  33.   ELSE (* Load, LoadExec[Return|Replace] *)
  34.     path := ADR(Path);
  35.     cmdln := ADR(CmdLn);
  36.     el := 0;
  37.     IF LENGTH(Env)=0 THEN 
  38.       BasePage := MagicSys.Basepage();
  39.       ptr := BasePage^.pEnv;
  40.     ELSE 
  41.       ptr := ADR(Env);
  42.     END;
  43.     von := ptr;
  44.     WHILE ptr^#0C DO
  45.       WHILE ptr^#0C DO INC(ptr); INC(el) END;
  46.       INC(ptr); INC(el)
  47.     END;
  48.     pl := 0; WHILE path^[pl]#0C DO INC(pl) END; INC(pl);
  49.     cl := 0; D0 := 1;
  50.     LOOP
  51.       WHILE cmdln^[D0]=' ' DO INC(D0) END; (* Leerzeichen berlesen *)
  52.       IF cmdln^[D0]<' ' THEN EXIT END;     (* Fertig *)
  53.       WHILE cmdln^[D0]>' ' DO              (* Argument *)
  54.         INC(cl);  INC(D0)
  55.       END;
  56.       INC(cl);                             (* Platz fr trennendes 0C/' ' *)
  57.     END;
  58.     env := MagicDOS.Malloc(el+7+pl+cl);      (* 7: "ARGV=" *)
  59.     Environment := env;
  60.     IF LONGCARD(env)>0 THEN
  61.       ptr := env;
  62.       bis := von + ADDRESS(LONG(el));
  63.       (* Altes Environment kopieren bis auf 
  64.        * alten ARGV, falls vorhanden
  65.        *)
  66.       WHILE LONGCARD(von)<LONGCARD(bis) DO 
  67.         IF lcPtr(ptr)^ = $65827186 (* "ARGV" *)
  68.         THEN
  69.            tmpPtr := ptr+ADDRESS(4L);
  70.            IF tmpPtr^ = '='
  71.            THEN
  72.              (* "ARGV=" gefunden, Ende suchen *)
  73.              WHILE (tmpPtr^ # 0C) & (LONGCARD(tmpPtr) < LONGCARD(bis)) DO
  74.                INC (tmpPtr);
  75.                (* Durch folgende Zeile wird sichergestellt, das nur 0C0C 
  76.                 * die Suche abbricht
  77.                 *)
  78.                IF tmpPtr^ = 0C THEN INC (tmpPtr) END;
  79.              END;
  80.              IF (LONGCARD(tmpPtr) < LONGCARD(bis))
  81.              THEN
  82.                INC (tmpPtr);    (* Auf Zeichen nach letztem 0C *)
  83.                ptr := tmpPtr;
  84.              END;
  85.            END;
  86.         END;
  87.         ptr^ := von^; INC(ptr); INC(von)
  88.       END;
  89.       ptr^ := 'A'; INC(ptr); ptr^ := 'R'; INC(ptr); ptr^ := 'G'; INC(ptr);
  90.       ptr^ := 'V'; INC(ptr); ptr^ := '='; INC(ptr); ptr^ := 0C;  INC(ptr);
  91.       von := ADDRESS(path);
  92.       bis := von + ADDRESS(LONG(pl));
  93.       WHILE LONGCARD(von)<LONGCARD(bis) DO
  94.          ptr^ := von^; INC(ptr); INC(von)
  95.       END;
  96.       D0 := 1;
  97.       LOOP
  98.         WHILE cmdln^[D0]=' ' DO INC(D0) END;
  99.         IF cmdln^[D0]<' ' THEN EXIT END;
  100.         WHILE cmdln^[D0]>' ' DO
  101.           ptr^ := cmdln^[D0];
  102.           INC(ptr); INC(D0)
  103.         END;
  104.         ptr^ := 0C; INC(ptr);
  105.       END;
  106.       ptr^ := 0C;
  107.       cmdln^[0] := 177C (* ARGV-Kennung *)
  108.     END;
  109.     (*$A+*)
  110.     res := MagicDOS.Pexec(mode,path^,cmdln^,tpStr(env)^);
  111.     (*$A=*)
  112.     IF mode=MagicDOS.LoadnGo THEN
  113.       IF MagicDOS.Mfree(Environment) THEN END;
  114.     END;
  115.     RETURN res;
  116.   END;
  117. END Pexec;
  118.  
  119. END ExecV.
  120.